package com.client.data;

import java.util.ArrayList;
import java.util.List;

import com.client.forms.ProduitEditor;
import com.client.service.data.ProduitDataService;
import com.client.service.data.ProduitDataServiceAsync;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.shared.model.Produit;
import com.smartgwt.client.widgets.grid.events.CellClickEvent;
import com.smartgwt.client.widgets.grid.events.CellClickHandler;
/**
 * Panel de gestion {@link Produit}
 * @author queyroi
 *
 */
public class PanelBaseProduit extends Composite{
	/**
	 * Liste des {@link Produit} disponible (chargé par {@link ProduitDataService})
	 */
	private List<Produit> liste = new ArrayList<Produit>();
	/**
	 * Tableaux des {@link Produit} 
	 */
	private ProduitListGrid listGrid = new ProduitListGrid();
	/**
	 * Panel d'édition d'une {@link Produit} 
	 */
	private ProduitEditor dataEditor =  new ProduitEditor();
	/**
	 * Service RPC {@link Produit} 
	 */
	private final ProduitDataServiceAsync produitDataService = GWT.create(ProduitDataService.class);	
	
	private int indexSelected = 0;
	//Action button
	private HorizontalPanel buttonPanel = new HorizontalPanel();
	/**
	 * Sauvegarde de la {@link Produit} éditée par le {@link ProduitEditor} dans le DataStore
	 */
	private Button addButton = new Button();
	/**
	 * Suppresion de la {@link Produit} sélectionné dans le DataStore
	 */
	private Button removeButton = new Button();
	/**
	 * Mise à jour de la {@link Produit} éditée par le {@link ProduitEditor} dans le DataStore
	 */
	private Button updateButton = new Button();
	/**
	 * Vider le {@link ProduitEditor}
	 */
	private Button clearEditorButton = new Button();
		
	public PanelBaseProduit() {
				
		listGrid.addCellClickHandler(new CellClickHandler() {
			
			public void onCellClick(CellClickEvent event) {
				removeButton.setEnabled(true);
				updateButton.setEnabled(true);				
				indexSelected = event.getRowNum();
				dataEditor.setEdited(liste.get(indexSelected));
				dataEditor.fill();
				}
			});

		fillGrid();
		
		addButton.addClickHandler(new ClickHandler() {			
			public void onClick(ClickEvent event) {
				try{
					dataEditor.check();
					dataEditor.getEdited().setKey(null);
					produitDataService.save(dataEditor.getEdited(), new AsyncCallback<String>() {						
						public void onSuccess(String result) {													
							fillGrid();					
						}						
						public void onFailure(Throwable caught) {
							Window.alert(caught.getMessage());
							
						}
					});
				}catch(IllegalArgumentException e){
					Window.alert(e.getMessage());
				}
			}
		});
		
		updateButton.addClickHandler(new ClickHandler() {			
			public void onClick(ClickEvent event) {
				try{		
					dataEditor.check();
					Produit produit = dataEditor.getEdited();
					produit.setKey(liste.get(indexSelected).getKey());
					produitDataService.update( produit, new AsyncCallback<String>() {						
						public void onSuccess(String result) {
							fillGrid();
							
						}						
						public void onFailure(Throwable caught) {
							Window.alert(caught.getMessage());
							
						}
					});
				}catch(IllegalArgumentException e){
					Window.alert(e.getMessage());
				}
			}
		});
		
		removeButton.addClickHandler(new ClickHandler() {
			
			public void onClick(ClickEvent event) {
				produitDataService.delete(liste.get(indexSelected), new AsyncCallback<String>() {
					
					public void onSuccess(String result) {
						fillGrid();
						dataEditor.setEmpty();
					}
					
					public void onFailure(Throwable caught) {
						Window.alert(caught.getMessage());						
					}
				});				
			}
		});
		
		clearEditorButton.addClickHandler(new ClickHandler() {
			
			public void onClick(ClickEvent event) {
				dataEditor.setEmpty();
				
			}
		});
		
	}
	/**
	 * Creation du Panel
	 * @return le conteneur de base du panel
	 */
	public VerticalPanel createPanel(){
		VerticalPanel mainPanel = new VerticalPanel();
		mainPanel.setSpacing(5);
		mainPanel.add(listGrid);
		
		buttonPanel.setSpacing(5);
		
		addButton.setText("Ajouter");
		buttonPanel.add(addButton);
		
		
		updateButton.setText("Mettre à jour");
		buttonPanel.add(updateButton);
		updateButton.setEnabled(false);
		
		removeButton.setText("Enlever");
		buttonPanel.add(removeButton);
		removeButton.setEnabled(false);
		
		clearEditorButton.setText("Vider Editeur");
		buttonPanel.add(clearEditorButton);
		
		mainPanel.add(buttonPanel);		
		
		mainPanel.add(dataEditor);
		
		return(mainPanel);
	}
	/**
	 * Méthode de remplissage de la {@link ProduitListGrid}
	 */
	private void fillGrid(){
			liste.clear();
			listGrid.removeAll();
			produitDataService.getList(new AsyncCallback<List>() {
			
			public void onSuccess(List result) {
				liste = (List<Produit>) result;
				for(Produit p : liste){
					listGrid.addData(p);
				}
			}
			
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
				
			}
		});
	}
	
	
	
}
